// 系统设置，用户详情
const db = require('../db/index');
// 加密中间件
const bcrypt = require('bcryptjs');  
// 生成uuid
const crypto = require('crypto');
const fs = require('fs');


// 暴露接口 avatar头像, 上传头像
exports.uploadAvatar = (req,res) => {
  // res.send() 用于向客户端发送响应; req.files 通常是在处理文件上传时可以获取到的已上传文件的信息对象;
  // 服务器将把第一个上传的文件的相关信息返回给发出请求的客户端
  // 打开postman: http://127.0.0.1:3007/user/uploadAvatar，body-->form-data-->key选择文件，value选择随便一个照片
  // 还要把app.js里面的app.use(jwt)全注释掉
  // res.send(req.files[0])

  //  res.send(req.body)  // 验证upload  data属性

  // 生成唯一标识
  const onlyId = crypto.randomUUID()
  let oldName = req.files[0].filename
  // originalname图片原来名字，filename上传到public/upload的名字，没有后缀名
  // 使用 Buffer.from 方法将原始文件名从latin1编码转换为Buffer对象;通过toString('utf8')方法将Buffer对象转换为UTF-8编码的字符串
  let newName = Buffer.from(req.files[0].originalname,'latin1').toString('utf8')
  fs.renameSync('./public/upload/'+ oldName, './public/upload/'+ newName)

  const sql = "insert into image set ?"
  // 第二个参数为 SQL 查询提供的参数值
  db.query(sql,{
    image_url: `http://127.0.0.1:3007/upload/${newName}`,
    onlyId
  },(err,result)=>{
    if(err) return res.cc(err)  // 插入失败
    res.send({
      onlyId,
      status: 0, // 返回状态码为0, 插入成功
      url: 'http://127.0.0.1:3007/upload/' + newName
    })
  })
}

// 头像绑定账号接口，需要从前端接收到3个参数：account,onlyId,url
// 涉及users表和image表，我们需要在image表插入account,  user表插入image_url数据
//  http://127.0.0.1:3007/user/bindAccount x-www-form 写三个参数account\onlyId\url,对应值从数据库里面拿
exports.bindAccount = (req,res) => {
  const { account, onlyId, url} = req.body
  const sql = 'update image set account = ? where onlyId = ?'
  db.query(sql, [account, onlyId], (err,result)=>{
    if(err) return res.cc(err)  // 失败
    if(result.affectedRows == 1){  // 确定更新操作是否成功地影响了恰好一行数据
      const sql1 = 'update users set image_url = ? where account = ?'
      db.query(sql1, [url,account], (err,result)=>{
        if(err) return res.cc(err)  // 失败
        res.send({
          status: 0,
          message: 'users表的image_url修改成功！',
        })
      })
    }
  })
}

// 获取用户信息 接收参数 id
exports.getUserInfo = (req,res) => {
  const sql = 'select * from users where id =?'
  db.query(sql, req.body.id, (err,result)=>{
    if(err) return res.cc(err)  // 失败
    result[0].password = ''
    res.send(result[0])
  })
}

// 修改姓名 接收参数 id name
exports.changeName = (req, res) => {
	const {id, name} = req.body
	const sql = 'update users set name = ? where id = ?'
	db.query(sql, [name, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改姓名成功'
		})
	})
}

// 修改性别 接收参数 id sex
exports.changeSex = (req, res) => {
	const {id, sex} = req.body
	const sql = 'update users set sex = ? where id = ?'
	db.query(sql, [sex, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改性别成功'
		})
	})
}

// 修改邮箱 接收参数 id email
exports.changeEmail = (req, res) => {
	const {id, email} = req.body
	const sql = 'update users set email = ? where id = ?'
	db.query(sql, [email, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改邮箱成功'
		})
	})
}

// 修改部门
exports.changeDepartment = (req, res) => {
	const {id, department} = req.body
	const sql = 'update users set department = ? where id = ?'
	db.query(sql, [department, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改部门成功'
		})
	})
}

// 修改用户密码 先输入旧密码 oldPassword 新密码 newPassword id 
exports.changePassword = (req, res) => {
  // req.body.oldPassword 是从客户端发送的请求体中获取的用户输入的旧密码。
  // result[0].password 通常是从数据库查询返回的结果中获取的用户存储在数据库中的旧密码
  const sql = 'select password from users where id =?'
  db.query(sql, req.body.id, (err,result)=>{
    if(err) return res.cc(err)  // 失败
    // 加密中间件bcrypt
    const compareResult = bcrypt.compareSync(req.body.oldPassword, result[0].password)
    if(!compareResult){
      res.send({
        status: 1,
        message: '旧密码错误！'
      })
    }
    
    // 新密码加密
    req.body.newPassword = bcrypt.hashSync(req.body.newPassword, 10)
    const sql1 = 'update users set password = ? where id = ?'
    db.query(sql1, [req.body.newPassword, req.body.id], (err,result)=>{
      if(err) return res.cc(err)  // 失败
      res.send({
        status: 0,
        message: '密码已修改！'
      })
    })
  })
}


// 忘记密码1：验证账户和与邮箱是否对应 email account
exports.verifyAccountAndEmail = (req, res) => {
	const {account, email} = req.body
	const sql = 'select * from users where account = ?'
	db.query(sql, account, (err, result) => {
		if (err) return res.cc(err)
		if (email == result[0].email) {
			res.send({
				status: 0,
				message: '查询成功',
				id: result[0].id,
			})
		} else {
			res.send({
				status: 1,
				message: '查询失败'
			})
		}
	})
}

// 忘记密码2：登录页面修改密码 参数 newPassword id
exports.changePasswordInLogin = (req, res) => { 
  // 使用 bcrypt 库对用户输入的新密码进行哈希处理，10 是生成哈希的工作因子，用于增加哈希的复杂度和安全性
	req.body.newPassword = bcrypt.hashSync(req.body.newPassword, 10)
	const sql = 'update users set password = ? where id = ?'
	db.query(sql, [req.body.newPassword, req.body.id], (err, result) => {
		if (err) return res.cc(err)
    if(result.affectedRows != 0){
      // 当 result.affectedRows 不为 0 时，说明至少有一行数据按照指定的条件被成功更新了，因此可以认为更新操作是成功的
      res.send({
        status: 0,
        message: '更新成功'
      })
    }else{
      res.send({
        status: 1,
        message: '更新失败'
      })
    }
    return
	})
}

// --------------------------------------------------------------用户管理
// 创建账号，添加管理员
exports.createAdmin = (req, res) => {
	const { account, password, name, sex, department, email, identity } = req.body
	const sql = 'select * from users where account = ?'
	db.query(sql, account, (err, results) => {
		if (results.length > 0) {  // 判断账号是否存在
			return res.send({
				status: 1,
				message: '账号已存在'
			})
		}
		// 使用 bcrypt.hashSync 生成散列密码
		const hashpassword = bcrypt.hashSync(password, 10)
		// “?” 只是一个占位符，后续传递给 db.query 方法的第二个参数
		const sql1 = 'insert into users set ?' 
		const create_time = new Date() 	
		// 这段代码用于构造一个对象，键为 password，值为 hashpassword
    db.query(sql1, {account, password:hashpassword, name, sex, department, email, identity, create_time, status: 0}, (err,results) => {
			if (results.affectedRows !== 1) { 
				// affectedRows为影响的行数，如果插入失败，那么就没有影响到行数，也就是行数不为1
				return res.send({
					status: 1,
					message: '添加管理员失败'
				})
			}
			res.send({
				status: 0,
				message: '添加管理员成功'
			})
    })
  })
}

// 获取管理员列表 参数是 identity 
exports.getAdminList = (req, res) => {
	const sql = 'select * from users where identity = ?'
	db.query(sql, req.body.identity, (err, results) => {
		if (err) return res.cc(err)
		results.forEach((e) => {
			e.password = ''
			e.create_time = ''
		})
		res.send(results)  // 返回列表
	})
}

// 编辑管理员账号信息，首先拿到id，这里是用户管理点击的弹窗
exports.editAdmin = (req, res) => {
	const { id, name, sex, email, department } = req.body
	const date = new Date()

	const sql = 'select department from users where id = ?'
	db.query(sql, id, (err, result) => { 
		// 由于加了  read_list 所以得先判断有没有修改部门
		if(result[0].department == department){  // 数据库，用户提交 
			const updateContent = { id, name, sex, email, department, update_time: date } // 修改的内容
			const sql1 = 'update users set ? where id = ?'
			db.query(sql1, [updateContent, updateContent.id], (err, result) => {
				if (err) return res.cc(err)
				res.send({
					status: 0,
					message: '修改管理员信息成功'
				})
			})
		}else{
			const updateContent = { id, name, sex, email, department, update_time: date, read_list:null, read_status:0 }
			const sql2 = 'update users set ? where id = ?'
			db.query(sql2, [updateContent, updateContent.id], (err, result) => {
				if (err) return res.cc(err)
				res.send({
					status: 0,
					message: '修改管理员信息成功'
				})
			})
		}//if	
	})// db
}

// 对管理员取消赋权 参数 id 删除
exports.changeIdentityToUser = (req, res) => {
	const identity = '用户'
	const sql = 'update users set identity = ? where id = ?'
	db.query(sql, [identity, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '降级成功'
		})
	})
}

// 对用户进行赋权 参数 id identity
exports.changeIdentityToAdmin = (req, res) => {
	const date = new Date()
	const sql = 'update users set identity = ?,update_time = ? where id = ?'
	db.query(sql, [req.body.identity, date, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '赋权成功'
		})
	})
}

// 通过账号对用户搜索 account identity
exports.searchUserByAccount = (req, res) => {
	const {account, identity} = req.body
	const sql = 'select * from users where account = ? and identity = ?'
	db.query(sql, [account, identity], (err, result) => {
		if (err) return res.cc(err)
		result.forEach((e) => {
			// 没用到就不要传递过来了 
			e.password = ''
			e.create_time = ''
		})
		res.send(result)
	})
}

// 通过部门对用户搜索 department identity = "用户"
exports.searchUserByDepartment = (req, res) => {
	const sql = 'select * from users where department = ? and identity = "用户"'
	db.query(sql, req.body.department, (err, result) => {
		if (err) return res.cc(err)
		result.forEach((e) => {
			e.password = ''
			e.create_time = ''
		})
		res.send(result)
	})
}

// 冻结用户 通过id 把status 置为 1 
exports.banUser = (req, res) => {
	const status = 1
	const sql = 'update users set status = ? where id = ?'
	db.query(sql, [status, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '冻结成功'
		})
	})
}

// 解冻用户
exports.hotUser = (req, res) => {
	const status = 0
	const sql = 'update users set status = ? where id = ?'
	db.query(sql, [status, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '解冻成功'
		})
	})
}

// 获取冻结用户列表
exports.getBanList = (req, res) => {
	const sql = 'select * from users where status = "1" '
	db.query(sql, (err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})
}

// 删除用户 id account
exports.deleteUser = (req, res) => {
	const sql = 'delete from users where id = ?'
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		const sql1 = 'delete from image where account = ?'
		db.query(sql1, req.body.account, (err, result) => {
			if (err) return res.cc(err)
			res.send({
				status: 0,
				message: '删除用户成功'
			})
		})
	})
}

// 获取对应身份的一个总人数 identity
exports.getAdminListLength = (req, res) => {
	const sql = 'select * from users where identity = ? '
	db.query(sql, req.body.identity, (err, result) => {
		if (err) return res.cc(err)
		res.send({
			length: result.length
		})
	})
}

// 监听换页返回数据 页码 pager identity  
exports.returnListData = (req, res) => {
	// req.body.pager 是用户请求的页码, 要跳过的记录数是 (页码 - 1) * 每页记录数
	const number = (req.body.pager-1) * 10
	// console.log(req.body.pager); // { pager: '1', identity: '产品管理员' }
	// 确保数据按创建时间顺序返回,限制返回的记录数量为 10 条 从数据库表中第0行开始
	const sql = `select * from users where identity = ? ORDER BY create_time limit 10 offset ${number} `
	db.query(sql, req.body.identity, (err, result) => {
		if (err) return res.cc(err)
		result.forEach((e) => {
			e.password = ''
			e.create_time = ''
		})
		res.send(result)
	})
}

